05 Intent概念及应用

启动Activity分为两种,显示调用和隐式调用。显示调用通过指定Intent组件名称来实现的,它一般用在知道目标组件名称的前提下,一般是在相同的应用程序内部实现的。隐式调用通过Intent Filter来实现的,它一般用在没有明确指出目标组件名称的前提下,一般是用于在不同应用程序之间。

显示调用

1
2
3
Intent intent=new Intent(MainActivity.this,SettingActivity.class);
intent.putExtra(EXTRA,contentEditText.getText().toString());
startActivity(intent);

而Manifest文件描述为:

1
2
3
4
5
6
7
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".SettingActivity" />

隐式调用

隐式不明确指定启动哪个Activity,而是在Intent Filter中设置Action、Data、Category,让系统来筛选出合适的Activity。清单文件配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.king.bester.myapplication">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity
android:name=".TargetActivity"
android:launchMode="singleTask"
android:taskAffinity="com.king.bester.myapplication" >
<intent-filter>
<action android:name="android.intent.action.SEND"/>
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain"/>
</intent-filter>
<intent-filter>
<action android:name="com.king.bester.demo" />
<action android:name="com.king.bester.DEMO" />
<category android:name="com.king.bester.a" />
<category android:name="com.king.bester.b" />
<category android:name="android.intent.category.DEFAULT" />
<data android:mimeType="text/plain"/>
</intent-filter>
</activity>
</application>
</manifest>

代码调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// 匹配第一组intent-filter
public void startA(View view) {
Intent intent = new Intent();
intent.setAction("android.intent.action.SEND");
intent.setType("text/plain");
startActivity(intent);
}
// 匹配第二组intent-filter
public void startB(View view) {
Intent intent = new Intent();
intent.setAction("com.king.bester.demo");
intent.addCategory("com.king.bester.a");
intent.setType("text/plain");
startActivity(intent);
}

1、startA()中没有设置category,是因为系统在调用startActivity或者startActivityForResult的时候会默认为Intent加上“android.intent.category.DEFAULT”这个category。所以,为了我们的Activity能接收隐式调用,必须在intent-filter中指定这个category。
2、action区分大小写
3、一个Activity可以有多个intent-filter,一个intent只要能匹配任何一组intent-filter即可启动对应的Activity。

浏览器启动本地App

Intent的过滤器:

1
2
3
4
5
6
<intent-filter>
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.BROWSABLE"/>
<category android:name="android.intent.category.DEFAULT"/>
<data android:scheme="app"/>
</intent-filter>

网页链接:

1
<a href="app://hello">Launch My App</a>

代码获取网页传递过来的参数:

1
2
Uri uri = getIntent().getData();
System.out.println(uri);

输出:

1
app://hello